package sv.gob.mtps.sib.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import sv.gob.mtps.sib.model.Bodega;
import sv.gob.mtps.sib.model.DetFacVw;
import sv.gob.mtps.sib.model.FacMasterVw;
import sv.gob.mtps.sib.model.Factura;
import sv.gob.mtps.sib.model.FacturaHasProducto;
import sv.gob.mtps.sib.model.Inventario;
import sv.gob.mtps.sib.model.InventarioHasTransacciones;
import sv.gob.mtps.sib.model.ObjProductVw;
import sv.gob.mtps.sib.model.Objetoespecifico;
import sv.gob.mtps.sib.model.ProductoHasObjetoespecifico;
import sv.gob.mtps.sib.model.Promedio;
import sv.gob.mtps.sib.model.PromedioUnitarioVw;
import sv.gob.mtps.sib.model.Transaccion;

@Repository
public class FacturaDAOImpl implements FacturaDAO{
	
	@Autowired
    private SessionFactory sessionFactory;

	@Override
	public void addFactura(Factura factura) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().save(factura);
	}

	@Override
	public List<Factura> listFactura() {
		// TODO Auto-generated method stub
		return sessionFactory.getCurrentSession().createQuery("from Factura order by idFactura desc").list();
	}

	@Override
	public void removeFactura(Integer id) {
		// TODO Auto-generated method stub
		Factura fact = (Factura) sessionFactory.getCurrentSession().load(Factura.class, id);
		if(fact != null){
			sessionFactory.getCurrentSession().delete(fact);
		}
	}

	@Override
	public Factura findFactura(Integer id) {
		// TODO Auto-generated method stub
		return (Factura) sessionFactory.getCurrentSession().get(Factura.class, id);
	}

	@Override
	public void updateFactura(Factura factura) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().update(factura);
	}
	
	/*se Agregan los metodos para 
	 * el ingreso del detalle 
	 * de la factura*/

	@Override
	public void addFacturaDet(FacturaHasProducto facturaDet) {
		sessionFactory.getCurrentSession().save(facturaDet);			
	}

	

	@Override
	public void removeFacturaDet(Integer id) {
		// TODO Auto-generated method stub
		FacturaHasProducto fact = (FacturaHasProducto) sessionFactory.getCurrentSession().load(FacturaHasProducto.class, id);
		if(fact != null){
			sessionFactory.getCurrentSession().delete(fact);
		}
		
		
	}

	@Override
	public FacturaHasProducto findFacturaDet(Integer id) {
		// TODO Auto-generated method stub
		return (FacturaHasProducto) sessionFactory.getCurrentSession().get(FacturaHasProducto.class, id);
	}

	

	@Override
	public void updateFacturaDet(FacturaHasProducto facturaDet) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().update(facturaDet);
	}

	@Override
	public List<FacturaHasProducto> listFacturaDet(Integer id) {
		// TODO Auto-generated method stub
		String hql = "from FacturaHasProducto f where f.factura.idFactura = " + id + " order by f.idFacturaHasProducto desc";		
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	@Override
	public List<ObjProductVw> listObjeto() {
		// TODO Auto-generated method stub
		return sessionFactory.getCurrentSession().createQuery("from ObjProductVw").list();
	}
	
	/*se agrega metodo para 
	 * la busqueda de Bodegas*/

	@Override
	public List<Bodega> listBodega() {
		// TODO Auto-generated method stub
		String hql = "from Bodega";
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}
	
	 /*Busqueda de inventario por bodega,fuente
     *  de fondo y producto_objetoespecifico
     */    

	@Override
	public List<Inventario> listInvent(int bodega, int fuenteFondo,
			int producto_objeto) {
		// TODO Auto-generated method stub
		String sql = "from Inventario i where i.bodega.idBodega = "+bodega +
				" and i.fuentefondo.idFuentefondo = " + fuenteFondo + 
				" and i.productoHasObjetoespecifico.idProductoHasObjetoespecifico = "+producto_objeto;
		return sessionFactory.getCurrentSession().createQuery(sql).list();
	}

	
	/*se agrega el inventario*/
	@Override
	public void addInventario(Inventario inv) {
		// TODO Auto-generated method stub
		
		sessionFactory.getCurrentSession().save(inv);
	}

	@Override
	public Bodega findBodega(int id) {
		// TODO Auto-generated method stub		
		return (Bodega) sessionFactory.getCurrentSession().get(Bodega.class, id);
	}

	@Override
	public ProductoHasObjetoespecifico findPrdObj(int id) {
		// TODO Auto-generated method stub
		return (ProductoHasObjetoespecifico) sessionFactory.getCurrentSession().get(ProductoHasObjetoespecifico.class, id);
	}

	@Override
	public void addTransaccion(InventarioHasTransacciones transact) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().save(transact);
		
	}

	@Override
	public List<FacturaHasProducto> listFacturaDet(Integer id, Integer idProObj) {
		// TODO Auto-generated method stub
		 String hql = "from FacturaHasProducto f where f.factura.idFactura = " + id + " and f.productoHasObjetoespecifico.idProductoHasObjetoespecifico = " + idProObj;			
		 return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	@Override
	public Transaccion findTransaccion(int id) {
		// TODO Auto-generated method stub
		return (Transaccion) sessionFactory.getCurrentSession().get(Transaccion.class, id);
	}

	@Override
	public void updateInventario(Inventario inv) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().update(inv);
	}

	@Override
	public List<InventarioHasTransacciones> listTransacciones(int documentoPadre,int hijo,int tipoTran) {
		// TODO Auto-generated method stub
		String hql = "from InventarioHasTransacciones iv where iv.idDocumentoPadre = " +documentoPadre + " and iv.numeroDocumento =" +hijo + "  and iv.transaccion.idTransaccion=" + tipoTran;
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	@Override
	public List<DetFacVw> listDetFact(Integer id) {
		// TODO Auto-generated method stub
		String hql="from DetFacVw ";
		return sessionFactory.getCurrentSession().createQuery("from DetFacVw where id.idFactura="+id + " order by id.idFacturaHasProducto desc").list();
	}

	@Override
	public int getTotalTran(int documentoPadre, int tipoTran) {
		
		String hql = "select sum(iv.productoCantidad) from InventarioHasTransacciones iv where iv.idDocumentoPadre = " +documentoPadre + "  and iv.transaccion.idTransaccion=" + tipoTran + " group by iv.idDocumentoPadre,iv.transaccion.idTransaccion";
		List datos = sessionFactory.getCurrentSession().createQuery(hql).list();
		if(!datos.isEmpty()){
			return Integer.parseInt(datos.get(0).toString());
		}
		else{
			return 0;
		}
		
	}

	@Override
	public int getTotalTran(int documentoPadre) {
		// TODO Auto-generated method stub
		String hql = "select sum(f.cantidad) from FacturaHasProducto f where f.factura.idFactura = " + documentoPadre + " group by f.factura.idFactura order by  f.idFacturaHasProducto desc";
		List datos = sessionFactory.getCurrentSession().createQuery(hql).list();
		if(!datos.isEmpty()){
			return Integer.parseInt(datos.get(0).toString());
		}
		else{
			return 0;
		}
		
	}

	@Override
	public List<FacMasterVw> listMasterVw() {
		// TODO Auto-generated method stub
		String hql = "from FacMasterVw order by id.idFactura desc";
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	@Override
	public List<Promedio> listPromedio(int productoId) {
		// TODO Auto-generated method stub
		String hql = "from Promedio where producto.idProducto="+productoId;
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	@Override
	public void addPromedio(Promedio pr) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().save(pr);
		
	}

	@Override
	public void updatePromedio(Promedio pr) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().update(pr);
	}

	@Override
	public Promedio findPromedio(Integer promedioId) {
		// TODO Auto-generated method stub
		return (Promedio) sessionFactory.getCurrentSession().get(Promedio.class, promedioId);
	}

	@Override
	public List<PromedioUnitarioVw> listPromedioTotal(int productoId) {
		// TODO Auto-generated method stub
		String hql = "from PromedioUnitarioVw where id.idProducto="+productoId;
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	
	
	

	

}
